A warm-up:

library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff,
    setequal, union

An example parallel coordinate plot to use as a template. This code is from Plotly documentation: https://plotly.com/r/parallel-coordinates-plot/


df <- read.csv("https://raw.githubusercontent.com/bcdunbar/datasets/master/parcoords_data.csv")

fig <- df %>%
  plot_ly(width = 1000, height = 600) 
fig <- fig %>% add_trace(type = 'parcoords',
          line = list(color = ~colorVal,
                      colorscale = 'Jet',
                      showscale = TRUE,
                      reversescale = TRUE,
                      cmin = -4000,
                      cmax = -100),
          dimensions = list(
            list(range = c(~min(blockHeight),~max(blockHeight)),
                 constraintrange = c(100000,150000),
                 label = 'Block Height', values = ~blockHeight),
            list(range = c(~min(blockWidth),~max(blockWidth)),
                 label = 'Block Width', values = ~blockWidth),
            list(tickvals = c(0,0.5,1,2,3),
                 ticktext = c('A','AB','B','Y','Z'),
                 label = 'Cyclinder Material', values = ~cycMaterial),
            list(range = c(-1,4),
                 tickvals = c(0,1,2,3),
                 label = 'Block Material', values = ~blockMaterial),
            list(range = c(~min(totalWeight),~max(totalWeight)),
                 visible = TRUE,
                 label = 'Total Weight', values = ~totalWeight),
            list(range = c(~min(assemblyPW),~max(assemblyPW)),
                 label = 'Assembly Penalty Weight', values = ~assemblyPW),
            list(range = c(~min(HstW),~max(HstW)),
                 label = 'Height st Width', values = ~HstW),
            list(range = c(~min(minHW),~max(minHW)),
                 label = 'Min Height Width', values = ~minHW),
            list(range = c(~min(minWD),~max(minWD)),
                 label = 'Min Width Diameter', values = ~minWD),
            list(range = c(~min(rfBlock),~max(rfBlock)),
                 label = 'RF Block', values = ~rfBlock)
            )
          )


fig

On to our code. Merge the two datasets and join them on the state abbreviation.

Define the regions based on CDC standards:

dat %>% mutate(region = (
  case_when(state %in% R1 ~ 1,
            state %in% R2 ~ 2,
            state %in% R3 ~ 3,
            state %in% R4 ~ 4,
            state %in% R5 ~ 5,
            state %in% R6 ~ 6,
            state %in% R7 ~ 7,
            state %in% R8 ~ 8,
            state %in% R9 ~ 9,
            state %in% R10 ~ 10, 
            TRUE ~ 'Other')
))
Error: must be a double vector, not a character vector
#Reference Documentation : https://plotly.com/r/reference/#parcoords

#DO NOT RUN YET. have not updated completely
fig <- dat %>%
  plot_ly(width = 1000, height = 600) 
fig <- fig %>% add_trace(type = 'parcoords',
          line = list(color = ~colorVal,
                      colorscale = 'Jet',
                      showscale = TRUE,
                      reversescale = TRUE,
                      cmin = -4000,
                      cmax = -100),
          dimensions = list(
            list(range = c(~min(blockHeight),~max(blockHeight)),
                 constraintrange = c(100000,150000),
                 label = 'Block Height', values = ~blockHeight),
            list(range = c(~min(blockWidth),~max(blockWidth)),
                 label = 'Block Width', values = ~blockWidth),
            list(tickvals = c(0,0.5,1,2,3),
                 ticktext = c('A','AB','B','Y','Z'),
                 label = 'Cyclinder Material', values = ~cycMaterial),
            list(range = c(-1,4),
                 tickvals = c(0,1,2,3),
                 label = 'Block Material', values = ~blockMaterial),
            list(range = c(~min(totalWeight),~max(totalWeight)),
                 visible = TRUE,
                 label = 'Total Weight', values = ~totalWeight),
            list(range = c(~min(assemblyPW),~max(assemblyPW)),
                 label = 'Assembly Penalty Weight', values = ~assemblyPW),
            list(range = c(~min(HstW),~max(HstW)),
                 label = 'Height st Width', values = ~HstW),
            list(range = c(~min(minHW),~max(minHW)),
                 label = 'Min Height Width', values = ~minHW),
            list(range = c(~min(minWD),~max(minWD)),
                 label = 'Min Width Diameter', values = ~minWD),
            list(range = c(~min(rfBlock),~max(rfBlock)),
                 label = 'RF Block', values = ~rfBlock)
            )
          )


fig
LS0tCnRpdGxlOiAiNzA2IFBhcmFsbGVsIENvb3JkaW5hdGVzIgphdXRob3I6ICdEYW55IFRob3JwZSBIdWVydGEnCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkEgd2FybS11cDoKCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShkcGx5cikKYGBgCgpBbiBleGFtcGxlIHBhcmFsbGVsIGNvb3JkaW5hdGUgcGxvdCB0byB1c2UgYXMgYSB0ZW1wbGF0ZS4gVGhpcyBjb2RlIGlzIGZyb20gUGxvdGx5IGRvY3VtZW50YXRpb246IGh0dHBzOi8vcGxvdGx5LmNvbS9yL3BhcmFsbGVsLWNvb3JkaW5hdGVzLXBsb3QvCmBgYHtyIFRlbXBsYXRlfQpkZiA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2JjZHVuYmFyL2RhdGFzZXRzL21hc3Rlci9wYXJjb29yZHNfZGF0YS5jc3YiKQoKZmlnIDwtIGRmICU+JQogIHBsb3RfbHkod2lkdGggPSAxMDAwLCBoZWlnaHQgPSA2MDApIApmaWcgPC0gZmlnICU+JSBhZGRfdHJhY2UodHlwZSA9ICdwYXJjb29yZHMnLAogICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSB+Y29sb3JWYWwsCiAgICAgICAgICAgICAgICAgICAgICBjb2xvcnNjYWxlID0gJ0pldCcsCiAgICAgICAgICAgICAgICAgICAgICBzaG93c2NhbGUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZXNjYWxlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGNtaW4gPSAtNDAwMCwKICAgICAgICAgICAgICAgICAgICAgIGNtYXggPSAtMTAwKSwKICAgICAgICAgIGRpbWVuc2lvbnMgPSBsaXN0KAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYyh+bWluKGJsb2NrSGVpZ2h0KSx+bWF4KGJsb2NrSGVpZ2h0KSksCiAgICAgICAgICAgICAgICAgY29uc3RyYWludHJhbmdlID0gYygxMDAwMDAsMTUwMDAwKSwKICAgICAgICAgICAgICAgICBsYWJlbCA9ICdCbG9jayBIZWlnaHQnLCB2YWx1ZXMgPSB+YmxvY2tIZWlnaHQpLAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYyh+bWluKGJsb2NrV2lkdGgpLH5tYXgoYmxvY2tXaWR0aCkpLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ0Jsb2NrIFdpZHRoJywgdmFsdWVzID0gfmJsb2NrV2lkdGgpLAogICAgICAgICAgICBsaXN0KHRpY2t2YWxzID0gYygwLDAuNSwxLDIsMyksCiAgICAgICAgICAgICAgICAgdGlja3RleHQgPSBjKCdBJywnQUInLCdCJywnWScsJ1onKSwKICAgICAgICAgICAgICAgICBsYWJlbCA9ICdDeWNsaW5kZXIgTWF0ZXJpYWwnLCB2YWx1ZXMgPSB+Y3ljTWF0ZXJpYWwpLAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYygtMSw0KSwKICAgICAgICAgICAgICAgICB0aWNrdmFscyA9IGMoMCwxLDIsMyksCiAgICAgICAgICAgICAgICAgbGFiZWwgPSAnQmxvY2sgTWF0ZXJpYWwnLCB2YWx1ZXMgPSB+YmxvY2tNYXRlcmlhbCksCiAgICAgICAgICAgIGxpc3QocmFuZ2UgPSBjKH5taW4odG90YWxXZWlnaHQpLH5tYXgodG90YWxXZWlnaHQpKSwKICAgICAgICAgICAgICAgICB2aXNpYmxlID0gVFJVRSwKICAgICAgICAgICAgICAgICBsYWJlbCA9ICdUb3RhbCBXZWlnaHQnLCB2YWx1ZXMgPSB+dG90YWxXZWlnaHQpLAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYyh+bWluKGFzc2VtYmx5UFcpLH5tYXgoYXNzZW1ibHlQVykpLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ0Fzc2VtYmx5IFBlbmFsdHkgV2VpZ2h0JywgdmFsdWVzID0gfmFzc2VtYmx5UFcpLAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYyh+bWluKEhzdFcpLH5tYXgoSHN0VykpLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ0hlaWdodCBzdCBXaWR0aCcsIHZhbHVlcyA9IH5Ic3RXKSwKICAgICAgICAgICAgbGlzdChyYW5nZSA9IGMofm1pbihtaW5IVyksfm1heChtaW5IVykpLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ01pbiBIZWlnaHQgV2lkdGgnLCB2YWx1ZXMgPSB+bWluSFcpLAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYyh+bWluKG1pbldEKSx+bWF4KG1pbldEKSksCiAgICAgICAgICAgICAgICAgbGFiZWwgPSAnTWluIFdpZHRoIERpYW1ldGVyJywgdmFsdWVzID0gfm1pbldEKSwKICAgICAgICAgICAgbGlzdChyYW5nZSA9IGMofm1pbihyZkJsb2NrKSx+bWF4KHJmQmxvY2spKSwKICAgICAgICAgICAgICAgICBsYWJlbCA9ICdSRiBCbG9jaycsIHZhbHVlcyA9IH5yZkJsb2NrKQogICAgICAgICAgICApCiAgICAgICAgICApCgoKZmlnCmBgYAoKT24gdG8gb3VyIGNvZGUuIE1lcmdlIHRoZSB0d28gZGF0YXNldHMgYW5kIGpvaW4gdGhlbSBvbiB0aGUgc3RhdGUgYWJicmV2aWF0aW9uLgpgYGB7ciBSZWFkIERhdGEsIGluY2x1ZGU9RkFMU0V9CmRhdCA8LSByZWFkLmNzdigiLi4vY292aWRfdHJhY2tpbmdfaGlzdG9yeS5jc3YiKQpkYXQkZGF0ZSA8LSBhcy5mYWN0b3IoZGF0JGRhdGUpCgpkYXQgPC0gZGF0ICU+JSBmdWxsX2pvaW4oLiwgcmVhZC5jc3YoIi4uL2Nvcm9uYXZpcnVzLXNjaG9vbC1jbG9zdXJlcy1kYXRhLTQtNy0yMDIwLmNzdiIpLCBieSA9IGMoJ3N0YXRlJyA9ICdTdGF0ZUFiYnJldmlhdGlvbicpKQpkYXQkU3RhdGVDbG9zdXJlU3RhcnREYXRlIDwtIGFzLkRhdGUoZGF0JFN0YXRlQ2xvc3VyZVN0YXJ0RGF0ZSwgZm9ybWF0ID0gJyVtLyVkLyVZJykKCmBgYAoKRGVmaW5lIHRoZSByZWdpb25zIGJhc2VkIG9uIENEQyBzdGFuZGFyZHM6CmBgYHtyIFJlZ2lvbiBEZWZpbnRpb259CiNkZWZpbmUgcmVnaW9ucyBiYXNlZCBvbiBDREMgc3RhbmRhcmRzIChodHRwczovL3d3dy5jZGMuZ292L2Nvcm9uYXZpcnVzLzIwMTktbmNvdi9jb3ZpZC1kYXRhL2Nvdmlkdmlldy8wNDEwMjAyMC9sYWJzLXJlZ2lvbnMuaHRtbCkKClIxIDwtIGMoJ0NUJywgJ01FJywgJ01BJywgJ05IJywgJ1JJJywgJ1ZUJykKUjIgPC0gYygnTkonLCAnTlknLCAnUFInKQpSMyA8LSBjKCdERScsICdEQycsICdNRCcsICdQQScsICdWQScsICdXVicpClI0IDwtIGMoJ0FMJywgJ0ZMJywgJ0dBJywgJ0tZJywgJ01TJywgJ05DJywgJ1NDJywgJ1ROJykKUjUgPC0gYygnSUwnLCAnSU4nLCAnTUknLCdNTicsJ09IJywnV0knKQpSNiA8LSBjKCdBUicsJ0xBJywnTk0nLCdPSycsJ1RYJykKUjcgPC0gYygnSUEnLCAnS1MnLCAnTU8nLCAnTkUnKQpSOCA8LSBjKCdDTycsICdNVCcsICdORCcsJ1NEJywnVVQnLCdXWScpClI5IDwtIGMoJ0FaJywgJ0NBJywgJ0dVJywgJ0hJJywnTlYnKQpSMTAgPC0gYygnQUsnLCdJRCcsJ09SJywnV0EnKQoKI3B1dCBhcyBjaGFyYWN0ZXIgc28gdGhhdCBhbGwgc3RhdGVzL3RlcnJpdG9yaWVzIGhhdmUgYSB2YWx1ZSBhbmQgYWxsIHZhbHVlcyBvZiBzYW1lIHR5cGUgb2YgdmVjdG9yCmRhdCAlPiUgbXV0YXRlKHJlZ2lvbiA9ICgKICBjYXNlX3doZW4oc3RhdGUgJWluJSBSMSB+ICcxJywKICAgICAgICAgICAgc3RhdGUgJWluJSBSMiB+ICcyJywKICAgICAgICAgICAgc3RhdGUgJWluJSBSMyB+ICczJywKICAgICAgICAgICAgc3RhdGUgJWluJSBSNCB+ICc0JywKICAgICAgICAgICAgc3RhdGUgJWluJSBSNSB+ICc1JywKICAgICAgICAgICAgc3RhdGUgJWluJSBSNiB+ICc2JywKICAgICAgICAgICAgc3RhdGUgJWluJSBSNyB+ICc3JywKICAgICAgICAgICAgc3RhdGUgJWluJSBSOCB+ICc4JywKICAgICAgICAgICAgc3RhdGUgJWluJSBSOSB+ICc5JywKICAgICAgICAgICAgc3RhdGUgJWluJSBSMTAgfiAnMTAnLCAKICAgICAgICAgICAgVFJVRSB+ICdPdGhlcicpCikpCmBgYAoKCmBgYHtyIFBDQSBBdHRlbXB0LCBldmFsID0gRn0KI1JlZmVyZW5jZSBEb2N1bWVudGF0aW9uIDogaHR0cHM6Ly9wbG90bHkuY29tL3IvcmVmZXJlbmNlLyNwYXJjb29yZHMKCiNETyBOT1QgUlVOIFlFVC4gaGF2ZSBub3QgdXBkYXRlZCBjb21wbGV0ZWx5CmZpZyA8LSBkYXQgJT4lCiAgcGxvdF9seSh3aWR0aCA9IDEwMDAsIGhlaWdodCA9IDYwMCkgCmZpZyA8LSBmaWcgJT4lIGFkZF90cmFjZSh0eXBlID0gJ3BhcmNvb3JkcycsCiAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9IH5jb2xvclZhbCwKICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc2NhbGUgPSAnSmV0JywKICAgICAgICAgICAgICAgICAgICAgIHNob3dzY2FsZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlc2NhbGUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgY21pbiA9IC00MDAwLAogICAgICAgICAgICAgICAgICAgICAgY21heCA9IC0xMDApLAogICAgICAgICAgZGltZW5zaW9ucyA9IGxpc3QoCiAgICAgICAgICAgIGxpc3QocmFuZ2UgPSBjKH5taW4oYmxvY2tIZWlnaHQpLH5tYXgoYmxvY2tIZWlnaHQpKSwKICAgICAgICAgICAgICAgICBjb25zdHJhaW50cmFuZ2UgPSBjKDEwMDAwMCwxNTAwMDApLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ0Jsb2NrIEhlaWdodCcsIHZhbHVlcyA9IH5ibG9ja0hlaWdodCksCiAgICAgICAgICAgIGxpc3QocmFuZ2UgPSBjKH5taW4oYmxvY2tXaWR0aCksfm1heChibG9ja1dpZHRoKSksCiAgICAgICAgICAgICAgICAgbGFiZWwgPSAnQmxvY2sgV2lkdGgnLCB2YWx1ZXMgPSB+YmxvY2tXaWR0aCksCiAgICAgICAgICAgIGxpc3QodGlja3ZhbHMgPSBjKDAsMC41LDEsMiwzKSwKICAgICAgICAgICAgICAgICB0aWNrdGV4dCA9IGMoJ0EnLCdBQicsJ0InLCdZJywnWicpLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ0N5Y2xpbmRlciBNYXRlcmlhbCcsIHZhbHVlcyA9IH5jeWNNYXRlcmlhbCksCiAgICAgICAgICAgIGxpc3QocmFuZ2UgPSBjKC0xLDQpLAogICAgICAgICAgICAgICAgIHRpY2t2YWxzID0gYygwLDEsMiwzKSwKICAgICAgICAgICAgICAgICBsYWJlbCA9ICdCbG9jayBNYXRlcmlhbCcsIHZhbHVlcyA9IH5ibG9ja01hdGVyaWFsKSwKICAgICAgICAgICAgbGlzdChyYW5nZSA9IGMofm1pbih0b3RhbFdlaWdodCksfm1heCh0b3RhbFdlaWdodCkpLAogICAgICAgICAgICAgICAgIHZpc2libGUgPSBUUlVFLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ1RvdGFsIFdlaWdodCcsIHZhbHVlcyA9IH50b3RhbFdlaWdodCksCiAgICAgICAgICAgIGxpc3QocmFuZ2UgPSBjKH5taW4oYXNzZW1ibHlQVyksfm1heChhc3NlbWJseVBXKSksCiAgICAgICAgICAgICAgICAgbGFiZWwgPSAnQXNzZW1ibHkgUGVuYWx0eSBXZWlnaHQnLCB2YWx1ZXMgPSB+YXNzZW1ibHlQVyksCiAgICAgICAgICAgIGxpc3QocmFuZ2UgPSBjKH5taW4oSHN0Vyksfm1heChIc3RXKSksCiAgICAgICAgICAgICAgICAgbGFiZWwgPSAnSGVpZ2h0IHN0IFdpZHRoJywgdmFsdWVzID0gfkhzdFcpLAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYyh+bWluKG1pbkhXKSx+bWF4KG1pbkhXKSksCiAgICAgICAgICAgICAgICAgbGFiZWwgPSAnTWluIEhlaWdodCBXaWR0aCcsIHZhbHVlcyA9IH5taW5IVyksCiAgICAgICAgICAgIGxpc3QocmFuZ2UgPSBjKH5taW4obWluV0QpLH5tYXgobWluV0QpKSwKICAgICAgICAgICAgICAgICBsYWJlbCA9ICdNaW4gV2lkdGggRGlhbWV0ZXInLCB2YWx1ZXMgPSB+bWluV0QpLAogICAgICAgICAgICBsaXN0KHJhbmdlID0gYyh+bWluKHJmQmxvY2spLH5tYXgocmZCbG9jaykpLAogICAgICAgICAgICAgICAgIGxhYmVsID0gJ1JGIEJsb2NrJywgdmFsdWVzID0gfnJmQmxvY2spCiAgICAgICAgICAgICkKICAgICAgICAgICkKCgpmaWcKYGBgCgo=